/*
 * Deck.java
 * 
 * @author Michael Hansen
 * @author Lukas Thuernagel
 * @author Soeren Warszus
 */

package risk.card;
import java.util.*;

/**
 * Deck stellt ein Kartenstapel mit Objekten der Klassentyps <Type> dar. 
 * Der Kartenstapel ist eine LinkedList
 */
public class Deck {
    /** 
     * LinkedList zum Sammeln der Objekte vom Typ Card
     */
    private LinkedList<Card> deck;
    

    /**
     * Konstruktor
     */
    public Deck() {
        deck = new LinkedList();
    }
    
    /**
     * Methode shuffle zum mischen des Kartenstapels. Verwendet die Klasse 
     * java.util.Collections zum Mischen (shuffle) der Objekte.
     */
    public void shuffle(){
        if(deck.size()>1)
           Collections.shuffle(deck);
    }
    
    /**
     * Methode takeFirst dient zum entnehmen der obersten Karte von dem 
     * Stapel. Die Karte wird aus dem Stapel geloescht, da sie sich im Stapel
     * nicht mehr befindet
     *
     * @return Erstes Objekt vom Typ Type aus dem Kartenstapel
     */
    public Card takeFirst(){
        Card c = deck.getFirst();
        deck.removeFirst();
        return c;
    }
    
    /**
     * Pruefen, ob der Kartenstapel leer ist.
     *
     * @return Wahrheitswert, ob Kartenstapel leer ist
     */
    public boolean isEmpty(){
        return deck.isEmpty();
    }
    
    /**
     * Gibt die Laenge des Kartenstapels zurueck
     * 
     * @return int size Laenge des Stapels
     */
    public int getLength(){
        return deck.size();
    }
    
    
    /**
     * Methode insert dient zum zuruecklegen bzw. hinzufuegen eines Objektes 
     * in den Stapel. 
     * 
     * @param newCard Fuegt eine Karte zum Stapel hinzu..
     */
    public void insert(Card newCard){
        deck.addLast(newCard);
    }
    
    /**
     * Methode changeDeck ermoeglicht es den Stapel auszutauschen.
     *
     * @param newDeck der neue Stapel.
     */
    public void changeDeck(LinkedList<Card> newDeck){
        this.deck = newDeck;
    }
    
    /**
     * Rueckgabe des Stapels
     *
     * @return LinkedList<Card> deck
     */
    public LinkedList<Card> getDeck(){
        return this.deck;
    }
}
